package com.berchen.原子变量和CAS算法;

/**
 * 模拟CAS算法
 */
public class TestCompareAndSwap {

    public static void main(String[] args){

        final CompareAndSwap cas=new CompareAndSwap();
        for(int i=0;i<10;i++){

            new Thread(new Runnable() {
                @Override
                public void run() {

                    int expectedValue=cas.get();    // 更改值之前获取一次数据
                    boolean flag=cas.compareAndSet(expectedValue,(int)Math.random()*101);   // 设置值，返回为true设置成功，返回为false设置失败。在设置之前还会获取一次数据。并且将两次获取的数据进行一个判断。
                    System.out.println(flag);
                }
            }).start();
        }
    }
}
class CompareAndSwap{

    private int value;  // 默认值

    // 获取内存值
    public synchronized int get(){

        return value;
    }

    // 比较的方法
    public synchronized int compareAndSwap(int expectedValue,int newValue){

        int oldValue=value; // 读取内存值
        if(oldValue==expectedValue){ // 判断内存值是否等于预估值

            this.value=newValue; // 替换
        }
        return oldValue;
    }
    // 设置值，并且判断是否设置成功。
    public synchronized boolean compareAndSet(int expectedValue,int newValue){

        // compareAndSwap方法的返回值，如果设置成功就是预估值，如果没有设置成功就是旧值。
        return expectedValue==compareAndSwap(expectedValue, newValue);  //compareAndSwap 方法中对oldValue和expectedValue进行了判断，返回值就是oldValue。所以这条语句的返回值决定了值是否被替换。
    }
}
